#include "server.h"

// 构造函数
Server::Server(const char *ip, int port)
{
    this->ip = ip;
    this->port = port;
}
Server::~Server()
{
    close(socketFd);
}

// 线程函数
void *Server::pthread_func(void *arg)
{
    MSG clientMsg = *(MSG *)arg;
    UserManage *userManage = new UserManage(clientMsg.clientFd);
    // 线程处理数据收发
    char buf[500] = "";
    while (1)
    {
        // char buf[500] = "";
            
        memset(buf, 0, sizeof(buf));
        ssize_t recvSize = recv(clientMsg.clientFd, buf, 500, 0);
        
        if (recvSize < 0)
        {
            perror("接受客户端数据失败\n");
            break;
            //netstat -tulpn | grep :端口号
        }
        // cout<<("接收到的客户端数据为%s", buf) <<endl;
        
        userManage->read_cb(buf);
    }
    close(clientMsg.clientFd);
}

// 启动服务器
int Server::startServer()
{ // 判断ip和port不为空
    ChatDatabase::getInstanceChatDatabase()->my_database_connect("mychat");
    if (ip == NULL || port == 0)
    {
        return -1;
    }
    // 创建套接字
    socketFd = socket(AF_INET, SOCK_STREAM, 0);
    if (socketFd < 0)
    {
        perror("套接字创建失败\n");
        return -1;
    }
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(port);
    serverAddr.sin_addr.s_addr = inet_addr(ip);

    // 绑定套接字
    if (bind(socketFd, (struct sockaddr *)&serverAddr, (socklen_t)sizeof(serverAddr)) != 0)
    {
        perror("套接字绑定失败\n");
        close(socketFd);
        return -1;
    }

    // 监听套接字
    if (listen(socketFd, 5) != 0)
    {
        perror("套接字监听失败\n");
        close(socketFd);
        return -1;
    }
    // 端口复用
    int on = 1;
    if (setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &on, (socklen_t)sizeof(on)) < 0)
    {
        perror("端口复用失败\n");
        close(socketFd);
        return 1;
    }

    // 循环接收客户端连接
    while (1)
    {
        MSG clientMsg;
        socklen_t len = sizeof(clientMsg.clientAddr);
        int clientFd = accept(socketFd, (struct sockaddr *)&clientMsg.clientAddr, &len);
        if (clientFd < 0)
        {
            perror("客户端连接失败\n");
            return -1;
        }
        printf("客户端连接成功\n");

        // 创建线程
        pthread_t tid = 0;
        clientMsg.clientFd = clientFd;
        // 启动线程
        pthread_create(&tid, NULL, Server::pthread_func, (void *)&clientMsg);
        //分离线程
        pthread_detach(tid);
    }
    close(socketFd);
    return 1;
}

// 停止服务
int Server::closeServer()
{
    close(socketFd);
    
}

// void Server::read_cb(struct bufferevent *bev, void *ctx){

//     struct Args * args = (struct Args *)ctx;

//     struct sockaddr_in *addr = (struct sockaddr_in*)(args->addr);
//     cout << "From fd : " << args->fd << ", Client addr:port -> " << inet_ntoa(addr->sin_addr)
//         << ":" << ntohs(addr->sin_port) << endl;

//     char recvbuf[1024] = {0};
//     int size = bufferevent_read(bev, recvbuf, sizeof(recvbuf));
//     if(size < 0) {
//         cout << "bufferevent_read error" << endl;
//     }

//     cout << "Server recv: " << recvbuf << endl;

//     Json::Reader reader;        // 解析json
//     Json::Value val;            // 解析的json数据

//     //cout << "begin parse" << endl;
//     if(!reader.parse(recvbuf, val)){
//         cout << "parse failure" << endl;
//         return;
//     }
//     //cout << "parse success" << endl;

//     int cmd = val["cmd"].asInt();
//     switch(cmd){

//     case REGISTER:
//         // 注册
//         server_register(bev, val);
//         break;

//     case LOGIN:
//         // 登录并获取用户数据
//         server_login(bev, val);
//         break;

//     case CHAT:
//         // 用户聊天转发
//         transferMsg(bev, val);
//         break;

//     case FRIEND:
//         // 好友操作
//         friendoperate(bev,val);
//         break;

//     case UPDATA:
//         // 更新数据库数据
//         break;

//     default:
//         break;
//     }

// }